/**
 * EasyUI for jQuery 1.9.4
 *
 * Copyright (c) 2009-2020 www.jeasyui.com. All rights reserved.
 *
 * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
 * To use it on other terms please contact us: info@jeasyui.com
 *
 */
/**
 * resizable - EasyUI for jQuery
 *
 */
(function ($) {
    function resize(e) {
        var resizeData = e.data;
        var options = $.data(resizeData.target, 'resizable').options;
        if (resizeData.dir.indexOf('e') != -1) {
            var width = resizeData.startWidth + e.pageX - resizeData.startX;
            width = Math.min(
                Math.max(width, options.minWidth),
                options.maxWidth
            );
            resizeData.width = width;
        }
        if (resizeData.dir.indexOf('s') != -1) {
            var height = resizeData.startHeight + e.pageY - resizeData.startY;
            height = Math.min(
                Math.max(height, options.minHeight),
                options.maxHeight
            );
            resizeData.height = height;
        }
        if (resizeData.dir.indexOf('w') != -1) {
            var width = resizeData.startWidth - e.pageX + resizeData.startX;
            width = Math.min(
                Math.max(width, options.minWidth),
                options.maxWidth
            );
            resizeData.width = width;
            resizeData.left = resizeData.startLeft + resizeData.startWidth - resizeData.width;
        }
        if (resizeData.dir.indexOf('n') != -1) {
            var height = resizeData.startHeight - e.pageY + resizeData.startY;
            height = Math.min(
                Math.max(height, options.minHeight),
                options.maxHeight
            );
            resizeData.height = height;
            resizeData.top = resizeData.startTop + resizeData.startHeight - resizeData.height;
        }
    }

    function applySize(e) {
        var resizeData = e.data;
        var t = $(resizeData.target);
        t.css({
            left: resizeData.left,
            top: resizeData.top
        });
        if (t.outerWidth() != resizeData.width) {
            t._outerWidth(resizeData.width)
        }
        if (t.outerHeight() != resizeData.height) {
            t._outerHeight(resizeData.height)
        }
    }

    function doDown(e) {
        $.fn.resizable.isResizing = true;
        $.data(e.data.target, 'resizable').options.onStartResize.call(e.data.target, e);
        return false;
    }

    function doMove(e) {
        resize(e);
        if ($.data(e.data.target, 'resizable').options.onResize.call(e.data.target, e) != false) {
            applySize(e)
        }
        return false;
    }

    function doUp(e) {
        $.fn.resizable.isResizing = false;
        resize(e, true);
        applySize(e);
        $.data(e.data.target, 'resizable').options.onStopResize.call(e.data.target, e);
        $(document)._unbind('.resizable');
        $('body').css('cursor', '');
        return false;
    }

    // get the resize direction
    function getDirection(e) {
        var opts = $(e.data.target).resizable('options');
        var tt = $(e.data.target);
        var dir = '';
        var offset = tt.offset();
        var width = tt.outerWidth();
        var height = tt.outerHeight();
        var edge = opts.edge;
        if (e.pageY > offset.top && e.pageY < offset.top + edge) {
            dir += 'n';
        } else if (e.pageY < offset.top + height && e.pageY > offset.top + height - edge) {
            dir += 's';
        }
        if (e.pageX > offset.left && e.pageX < offset.left + edge) {
            dir += 'w';
        } else if (e.pageX < offset.left + width && e.pageX > offset.left + width - edge) {
            dir += 'e';
        }

        var handles = opts.handles.split(',');
        handles = $.map(handles, function (h) {
            return $.trim(h).toLowerCase();
        });
        if ($.inArray('all', handles) >= 0 || $.inArray(dir, handles) >= 0) {
            return dir;
        }
        for (var i = 0; i < dir.length; i++) {
            var index = $.inArray(dir.substr(i, 1), handles);
            if (index >= 0) {
                return handles[index];
            }
        }
        return '';
    }

    $.fn.resizable = function (options, param) {
        if (typeof options == 'string') {
            return $.fn.resizable.methods[options](this, param);
        }

        return this.each(function () {
            var opts = null;
            var state = $.data(this, 'resizable');
            if (state) {
                $(this)._unbind('.resizable');
                opts = $.extend(state.options, options || {});
            } else {
                opts = $.extend({}, $.fn.resizable.defaults, $.fn.resizable.parseOptions(this), options || {});
                $.data(this, 'resizable', {
                    options: opts
                });
            }

            if (opts.disabled == true) {
                return;
            }
            $(this)._bind('mousemove.resizable', {target: this}, function (e) {
                if ($.fn.resizable.isResizing) {
                    return
                }
                var dir = getDirection(e);
                $(e.data.target).css('cursor', dir ? dir + '-resize' : '');
            })._bind('mouseleave.resizable', {target: this}, function (e) {
                $(e.data.target).css('cursor', '');
            })._bind('mousedown.resizable', {target: this}, function (e) {
                var dir = getDirection(e);
                if (dir == '') {
                    return;
                }

                function getCssValue(css) {
                    var val = parseInt($(e.data.target).css(css));
                    if (isNaN(val)) {
                        return 0;
                    } else {
                        return val;
                    }
                }

                var data = {
                    target: e.data.target,
                    dir: dir,
                    startLeft: getCssValue('left'),
                    startTop: getCssValue('top'),
                    left: getCssValue('left'),
                    top: getCssValue('top'),
                    startX: e.pageX,
                    startY: e.pageY,
                    startWidth: $(e.data.target).outerWidth(),
                    startHeight: $(e.data.target).outerHeight(),
                    width: $(e.data.target).outerWidth(),
                    height: $(e.data.target).outerHeight(),
                    deltaWidth: $(e.data.target).outerWidth() - $(e.data.target).width(),
                    deltaHeight: $(e.data.target).outerHeight() - $(e.data.target).height()
                };
                $(document)._bind('mousedown.resizable', data, doDown);
                $(document)._bind('mousemove.resizable', data, doMove);
                $(document)._bind('mouseup.resizable', data, doUp);
                $('body').css('cursor', dir + '-resize');
            });
        });
    };

    $.fn.resizable.methods = {
        options: function (jq) {
            return $.data(jq[0], 'resizable').options;
        },
        enable: function (jq) {
            return jq.each(function () {
                $(this).resizable({disabled: false});
            });
        },
        disable: function (jq) {
            return jq.each(function () {
                $(this).resizable({disabled: true});
            });
        }
    };

    $.fn.resizable.parseOptions = function (target) {
        var t = $(target);
        return $.extend({},
            $.parser.parseOptions(target, [
                'handles', {
                    minWidth: 'number',
                    minHeight: 'number',
                    maxWidth: 'number',
                    maxHeight: 'number',
                    edge: 'number'
                }
            ]), {
                disabled: (t.attr('disabled') ? true : undefined)
            })
    };

    $.fn.resizable.defaults = {
        disabled: false,
        handles: 'n, e, s, w, ne, se, sw, nw, all',
        minWidth: 10,
        minHeight: 10,
        maxWidth: 10000,//$(document).width(),
        maxHeight: 10000,//$(document).height(),
        edge: 5,
        onStartResize: function (e) {
        },
        onResize: function (e) {
        },
        onStopResize: function (e) {
        }
    };

    $.fn.resizable.isResizing = false;

})(jQuery);
